/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Commons;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;

/**Questa classe implementa il descrittore del Worker.
 * Al suo interno contiene due attributi che definiscono
 * l'indirizzo del Worker e il suo stato
 *
 * @author team5
 */
public class WorkerDescriptor implements Serializable{
    
    
    public enum WorkerStatus {Free, Working}

    //Attributes
    private Address addr;
    private int PortaUDP=1000;
    private WorkerStatus status;
    private int nCPUnecessarie=1;
    private int quantitaMinRamMB=256;
    private int spazioDiscoOccupatoGB=8;
    private String sistemaOperativo;
    private int processiInCoda=0;

    /**STEP 2:
     * Campo necessario per trasferire le informazioni del vectorClock
     * necessarie per la gestione dell'ordinamento del logging globale
     */
    private HashMap<Integer,Integer> vectorClock;


    //Operations

    /**Costruttore della classe
     *
     */
    public WorkerDescriptor()
    {
        if(Math.random()<0.6)
            sistemaOperativo="Linux";
        else
            sistemaOperativo="Solaris";
        this.vectorClock= new HashMap<Integer,Integer>();
    }



    /**Questo metodo restituisce l'indirizzo del worker
     *
     * @return l'indirizzo del worker
     */
    public Address getAddr()
    {
        return addr;
    }

    /**Questo metodo permette di impostare l'indirizzo del worker
     *
     * @param val l'indirizzo del worker
     */
    public void setAddr(Address val)
    {
        this.addr=val;
    }

    /**Questo metodo restituisce lo stato del worker
     *
     * @return lo stato del worker
     */
     public WorkerStatus getStatus()
    {
        return status;
    }

    /**Questo metodo permette di aggiungere sistemi operativi supportati dal WD
     *
     * @param SO supportato
     */
    public void setSO(String SO){
        this.sistemaOperativo=SO;
    }

     /**Questo metodo permette di impostare l'indirizzo del worker
     *
     * @param val lo stato del worker
     */
    public void setStatus(WorkerStatus val)
    {
        this.status=val;
    }
    /**Questo metodo restituisce la lista dei SO supportati
     *
     * @return arraylist di SO
     */
    public String getSO(){
        return this.sistemaOperativo;
    }
    /** Ritorna la Ram Minima
     * 
     * @return la Ram minima
     */
    public int getRamMinima(){
        return this.quantitaMinRamMB;
    }
    /** Ritorna la Cpu Min
     * 
     * @return la CPU min
     */
    public int getnCpuMin(){
        return this.nCPUnecessarie;
    }
    /** Ritorna lo spazio occupato
     * 
     * @return lo spazio occupato
     */
    public int getSpazioOccupato(){
        return this.spazioDiscoOccupatoGB;
    }
   /** Setta i processi in coda
    *
    * @param nProcessi in coda
    */
    public void setProcessiInCoda(int nProcessi){
        this.processiInCoda=nProcessi;
    }
    /** Ritorna processi in coda
     * 
     * @return i processi in coda
     */
    public int getProcessiInCoda(){
        return this.processiInCoda;
    }
    /** Setta la porta del WD
     *
     * @param nPorta del WD
     */
    public void setPortaUDP(int nPorta){
        this.PortaUDP=nPorta;
    }
    /** Ritorna la porta UDP
     *
     * @return la porta UDP
     */
    public int getPortaUDP(){
        return this.PortaUDP;
    }




     /**Override metodo toString
     * 
     * @return torna la stringa descrittiva del WD
     */
    @Override
    public String toString(){
    return "WD(Address:" +this.addr+" Status"+this.status+")";
    }

     /**STEP 2:
     * Fa parte dei metodi necessari per trasferire le informazioni del vectorClock necessarie per la gestione dell'ordinamento del logging globale.
     * @return vectorClock proveniente dall'entità precedente.
     */
    public HashMap<Integer,Integer> getVectorClock(){
        return this.vectorClock;
    }

    /**STEP 2:
     * Fa parte dei metodi necessari per trasferire le informazioni del vectorClock necessarie per la gestione dell'ordinamento del logging globale.
     * @param vectorClock
     */
    public void setVectorClock(HashMap<Integer,Integer> vectorClock){
        this.vectorClock=vectorClock;
    }


}
